package someTestExcemple.huaweiOd.container.array;

import java.util.*;
//todo 好像还有点问题

public class SimpleMemoryPool2 {

    /**
     * 注意：
     *
     * 1.内存池总大小为100字节。
     * 2.内存池地址分配必须是连续内存，并优先从低地址分配。
     * 3.内存释放后可被再次分配，已释放的内存在空闲时不能被二次释放。
     * 4.不会释放已申请的内存块的中间地址。
     * 5.释放操作只是针对首地址所对应的单个内存块进行操作，不会影响其它内存块。
     */
    //这里只用数组简单模拟还是不行
    private static final int POOL_SIZE = 100;
    private int[] memoryPool = new int[POOL_SIZE];
    private Map<String,String> addressMap = new HashMap<>();

    private int freeStart = 0;
    public String request(int size) {
        if (size <= 0 || size + freeStart > POOL_SIZE) {
            return "error";
        }
        for(int i= freeStart; i < freeStart + size; i++) {
            if (memoryPool[i] == 1) {
                return "error";
            }
            //表示以分配
            memoryPool[i] = 1;
        }
        int startAddress = freeStart;
        freeStart += size;
        //分配成功返回内存首地址
        return String.valueOf(startAddress);
    }
    public boolean  release(int startAddress) {
       if(startAddress < 0 || startAddress >= POOL_SIZE || memoryPool[startAddress] == 0) {
           return false; //无效释放
       }
       int size =0;
       //找到要释放的内存块大小
        while(startAddress + size < POOL_SIZE && memoryPool[startAddress + size] == 1) {
            size++;
        }
        //释放内存块
        for(int i=0; i<size;i++) {
            memoryPool[startAddress + i] = 0;
        }
        //freeStart向前移动
        freeStart =freeStart - size;
        return true;
    }

}
